Una asociación representa algún tipo de relación semántica entre clases en el dominio del problema.

Al modelar las clases y sus relaciones, también podemos representar las restricciones sobre el número de instancias que pueden participar en la asociación, esto se conoce como multiplicidad de la asociación.
Ejemplo:

Esto significa que Profesor sólo puede pertenecer a un departamento, pero Departamento puede tenen
La implementación depende de la multiplicidad de la asociación:
Implementación en JAVA
xxxxxxxxxx111public class Departamento {2 private String nombreDep;3 // Lista de n profesores, aquí está la asociación4 private ArrayList<Profesor> profesores; 5 // Constructor6 public Departamento(){}7 // Añadir un nuevo profesor8 Public void setProfesor(Profesor p){9 profesores.add(p);10 }11}xxxxxxxxxx51public class Profesor {2 private String nombre;3 private String apellidos;4 public Profesor(){}5}Una relación de una clase con otra se codifica en la declaración de la clase mediante refererncias a un tipo de objeto de la otra clase.
| Multiplicidad | Significado |
|---|---|
| 1 | Uno y sólo uno. |
| 0...1 | 0 o 1 como máximo |
| 0... | 0 o |
| 1...* | 1 como mínimo y |
La navegabilidad puede ser de dos tipos:


Implementación unidireccional en JAVA

xxxxxxxxxx111public class Profesor{2 private String nombre;3 // Asociación unidireccional con cardinalidad 1 para pais y departamento4 private Pais pais;5 private Departamento dept;6 7 public Profesor (Pais p, Departamento d) {8 pais = p;9 dept = d;10 }11}xxxxxxxxxx41public class Pais{2 private String nombre;3 private String idioma;4}xxxxxxxxxx31public class Departamento {2 private String nombre;3}
Las asociaciones pueden ser de difentes tipos según el dominio del problema que se desea resolver:
es una relación simple entre clases que especifica que los objetos de un elementos están unidos con los objetos de otro. Se puede navegar de uno a otro y viceversa.

Puede indicarse la dirección de la asociación con una flecha en caso de ser unidireccional.
Persona tiene una mascota
Cuando una clase esta asociada consigo misma, cuando una clase puede desempeñar varios roles:
Empleado dirige a empleado
Carpeta contiente carpetas
Es una variante de la relación de asociación, es cuando un objeto queda caracterizado por la agrupación de otros objetos en su estructura. Objeto B es parte del objeto A o A tiene un B
Zoo contiene animales, pero si el Zoo deja de existir, los animales seguirán existiendo.
La agregación representa un todo y sus partes.

Es una relación de agregación donde las partes no pueden existir fuera del todo.
Sin Edificio no pueden existir los pisos.
Agregación es una relación debil.
Composición es una relación fuerte.
Es una relación entre clases en la que la clase padre comparte su estructura y comportamiento con la clase hija. (La clase hija hereda de la clase padre).

Cada subclase incluira el comportamiento y las características de la superclase, salvo que los predefina la propia clase.
Al estender una clase, se heredan todas las funciones y los atributos de la clase padre (publicos y protected), y se pueden añadir nuevas funciones y atributos.
Visivilidad de los atributos:
| - Privado | private | v | x | x |
| + Publico | public | v | v | v |
| # Protegido | protected | v | v | x |
Si S es un subtipo de T, entonces los objetos del tipo T en un programa de coputadora pueden ser sustituidos por objetos del tipo S sin alternar ninguna de las propiedades de ese programa.
Para que esto se cumpla, la sublcase ha de comportarse como la superclase.
Ejemplo:

Cada subclase implementa su propia versión de los métodos abrir, cerrar y ejecutar.
En este caso, las funciones de la superclase no se pueden implementar, porque no sabemos con que base de datos se va a trabajar, entonces, la implementación de esos métodos las realizarán las subclases, cada una de ellas con su tipo de implementación.
Son clases que no pueden dar implemantación a alguno de sus métodos.
Las clases abstractas no se pueden utilizar para crear objetos, debe hacerse desde las clases hijas.
El cuerpo de los métodos de la clase abstracta lo proporciona la subclase.
Sirven como esquemas conceptuales reutilizables y organizativos.
Las subclases de la clase abstracta deben dar implementación a los métodos abstractos definidos en la clase abstracta.
Una interface es una clase abstracta que no proporciona implementación a ninguno de sus métodos.
Su ventaja es que permite la herencia múltiple.

Es cuando usamos el mismo método con multiples implementaciones en varias clases.

El polimorfismo se basa en dos propiedades:
Ejemplo:
xxxxxxxxxx91private Forma formas[];2private double areaTotal = 0.0;3
4formas [0] = new Cuadrado(2);5formas [1] = new Triangulo(3,1)6
7for(i = 0; i <= formas.size(); i++){8 areaTotal = areaTotal + formas [i].area();9}
Es el proceso de asociación de un atributo a un valor.
Si la propiedad se limita a funciones, la ligadura es la conexión entre la llamada a una función y el código que se ejecuta tras la llamada.
La ligaduras se clasifican segun su tiempo de ligadura:
Ligadura estática: se produce antes del tiempo de ejecución (en tiempo de compilación).
Ligadura dinámica: el código a ejecutar en respuesta a un mensaje no se determina hasta el momento de la ejecución.
La ligadura dinámica se encarga de relacionar la llamada a un método con el cuerpo del método que se ejecuta finalmente.
Ejemplo:
xxxxxxxxxx111private Forma formas[];2private double areaTotal = 0.0;3
4formas [0] = new Cuadrado(2);5formas [1] = new Triangulo(3,1)6
7public obtenerAreaTotal(){8 for(i = 0; i <= formas.size(); i++){9 areaTotal = areaTotal + formas [i].area();10 }11}Cuando llamamos a la función obtenerAreaTotal( ), nuestro programa llama al área de la figura que le toca en cada momento.